/*****************************************************************//**
 * \file   converter.h
 * \brief   转换函数说明：
 * 
 以unt16的变量0x1234为例。这里0x12是高字节，0x34是低字节。（高字节数据的权重高，低字节数据的权重低）
 （1）如果低字节存放在高地址，则为大端模式BigEdian    ：即0x34在高地址，0x12在低地址。
 （2）如果低字节存放在低地址，则为小端模式LittleEndian：即0x12在高地址，0x34在低地址。
 例：
 unt32 x = 0x00001234;		//十进制为4660
 char tp = *((char*)&x);  //取tp等于x的低地址部分
 //char tp=(char)x;      //这样也是一样的。
 if (tp == 0x00)			//如果低地址部分取出的值是高字节的值，则为大端
 if (tp == 0x34)			//如果低地址部分取出的值是低字节的值，则为小端
 下面的函数接口中，数组unt8* byteArry一律是小端模式，[0]保持低字节的值。
 前缀B_表示大端模式的数据与byteArry数组转换。
 前缀L_表示大端模式的数据与byteArry数组转换。
 
 STM32单片机：小端模式。x86：小端。
 STM8：大端。KEIL C51：大端。
 ARM既可以工作在大端模式，也可以工作在小端模式。
 注意：大小端模式是和硬件有关的，即和芯片本身有关，IDE不能进行设置。

 * 
 * \author admin
 * \date   August 2022
 *********************************************************************/

#ifndef _CONVERTER_H_
#define _CONVERTER_H_

#include"stl_type.h"



/// <summary>
/// 浮点数转换为字节数组。
/// </summary>
/// <param name="num">大端模式的浮点数</param>
/// <param name="byteArry">转换后的字节数组，[0]是低字节</param>
void B_FloatToBytes(float num, unt8* byteArry);
/// <summary>
/// unt32转换为字节数组。
/// </summary>
/// <param name="num">大端模式的unt32</param>
/// <param name="byteArry">转换后的字节数组，[0]是低字节</param>
void B_U32ToBytes(unt32 num, unt8* byteArry);
/// <summary>
/// 字节数组转为浮点数
/// </summary>
/// <param name="byteArry">待转换的字节数组，[0]是低字节</param>
/// <returns>转换的结果。大端模式的浮点数</returns>
float B_BytesToFloat(unt8* byteArry);
/// <summary>
/// 字节数组转为unt32
/// </summary>
/// <param name="byteArry">待转换的字节数组，[0]是低字节</param>
/// <returns>转换的结果，大端模式的unt32</returns>
unt32 B_BytesToU32(unt8* byteArry);


/// <summary>
/// 浮点数转换为字节数组。
/// </summary>
/// <param name="num">小端模式的浮点数</param>
/// <param name="byteArry">转换后的字节数组，[0]是低字节</param>
void L_FloatToBytes(float num, unt8* byteArry);
/// <summary>
/// unt32转换为字节数组。
/// </summary>
/// <param name="num">小端模式的unt32</param>
/// <param name="byteArry">转换后的字节数组，[0]是低字节</param>
void L_U32ToBytes(unt32 num, unt8* byteArry);
/// <summary>
/// 字节数组转为浮点数
/// </summary>
/// <param name="byteArry">待转换的字节数组，[0]是低字节</param>
/// <returns>转换的结果。小端模式的浮点数</returns>
float L_BytesToFloat(unt8* byteArry);
/// <summary>
/// 字节数组转为unt32
/// </summary>
/// <param name="byteArry">待转换的字节数组，[0]是低字节</param>
/// <returns>转换的结果，小端模式的unt32</returns>
unt32 L_BytesToU32(unt8* byteArry);




////////////////////   下面是日期相关的代码                    ////////////////////////////////////////////////////////////////////////


/// <summary>
/// 时间的结构体。这里采用了比较紧凑的方式来存放年月日时分秒，只用了7个字节。
/// </summary>
typedef struct __rtc_time__
{
    unt16 ui16Year;        // 1970~2106 允许范围：
    unt8 ui8Month;       // 1~12
    unt8 ui8DayOfMonth;  // 1~31
    unt8 ui8Hour;        // 0~23
    unt8 ui8Minute;      // 0~59
    unt8 ui8Second;      // 0~59
}rtc_time_t;


/// <summary>
/// 判断年份是否闰年
/// </summary>
/// <param name="year">待判断的年份</param>
/// <returns>1：闰年。0：平年。</returns>
unt8 isLeapYear(unt16 year);


/// <summary>
/// 将Unix时间戳转换为北京时间
/// </summary>
/// <param name="unixTime">待转换的时间戳</param>
/// <param name="tempBeijing">转换后的北京时间的结构体</param>
void UnixTimeStp2Beijing(unt32 unixTime, rtc_time_t* tempBeijing);
//

/// <summary>
/// 将北京时间转换为Unix时间戳 
/// </summary>
/// <param name="beijingTime">待转换的时间</param>
/// <returns>转换后的时间戳</returns>
unt32 Beijing2UnixTimeStp(rtc_time_t* beijingTime);
//


////////////////    下面是字符串的转换               //////////////////////////////////////////////////////////////////

/*
 static 修饰函数 - 静态函数
函数默认是有外部链接属性的，但是被 static 修饰后，会使得函数失去外部链接属性，变成内部链接属性。
所以 static 修饰的函数只能在自己所在的.c 文件内部使用，不能在其他文件中使用。
其他c文件有同名的文件，也可以正常编译。
*/



/// <summary>
/// 匹配字符串。看str是否包含msg。
/// </summary>
/// <param name="msg">已知字符串</param>
/// <param name="str">待匹配字符串</param>
/// <returns>是否匹配 </returns>
bool str_match(const char* msg, char* str);



/// <summary>
/// 将字符串形式的浮点数转换成浮点类型。
/// 这是迭代函数。
/// 会忽略字符串开头的空格。遇到非法字符会退出，如果字符串不是浮点数，会返回0。
/// </summary>
/// <param name="str">待转换的字符串</param>
/// <param name="f">提取的浮点数。</param>
/// <returns>当前字符串指针索引。即提取一个浮点数后的字符串位置。</returns>
int str_to_float(char* str, float* f);

/// <summary>
/// 将字符串形式的整形转换成整型
/// 这是迭代函数。
/// 会忽略字符串开头的空格。遇到非法字符会退出，如果字符串不是浮点数，会返回0。
/// </summary>
/// <param name="str">待转换的字符串</param>
/// <param name="i">提取的整数</param>
/// <returns>当前字符串指针索引。即提取一个浮点数后的字符串位置。</returns>
int str_to_int(char* str, int* i);



/// <summary>
/// 整形转字符串。
/// </summary>
/// <param name="val">待转换的数据</param>
/// <param name="str">转换的字符串，右对齐。如果字符串长度不够，只记录高位。</param>
/// <param name="str_width">字符串的宽度。包含一个符号位。实际显示的数字只有str_width-1位。</param>
/// <param name="radix">转换的进制。16进制内都可以</param>
/// <returns>数字转换成字符串的长度</returns>
void int_to_str(int val, char* str, int str_width, unsigned radix);
//

/// <summary>
/// 整形转字符串。
/// </summary>
/// <param name="val">待转换的数据</param>
/// <param name="str">转换的字符串，左对齐。如果字符串长度不够，只记录高位。</param>
/// <param name="str_width">字符串的宽度。包含一个符号位。实际显示的数字只有str_width-1位。</param>
/// <param name="radix">转换的进制。16进制内都可以</param>
/// <returns>数字转换成字符串的长度</returns>
int int_to_str_left(int val, char* str, int str_width, unsigned radix);
//

/// <summary>
/// 整形转字符串。
/// </summary>
/// <param name="val">待转换的数据</param>
/// <param name="str">转换的字符串，右对齐。如果字符串长度不够，只记录高位。</param>
/// <param name="str_width">字符串的宽度。</param>
/// <param name="radix">转换的进制。16进制内都可以</param>
/// <returns>数字转换成字符串的长度</returns>
void uint_to_str(unsigned int val, char* str, int str_width, unsigned radix);
//

/// <summary>
/// 整形转字符串。
/// </summary>
/// <param name="val">待转换的数据</param>
/// <param name="str">转换的字符串，左对齐。如果字符串长度不够，只记录高位。</param>
/// <param name="str_width">字符串的宽度。包含一个符号位。实际显示的数字只有str_width-1位。</param>
/// <param name="radix">转换的进制。16进制内都可以</param>
/// <returns>数字转换成字符串的长度</returns>
int uint_to_str_left(unsigned int val, char* str, int str_width, unsigned radix);
//

/// <summary>
/// 整形转字符串。
/// </summary>
/// <param name="val">待转换的数据</param>
/// <param name="str">转换的字符串，右对齐。如果字符串长度不够，只记录高位。</param>
/// <param name="str_width">字符串的宽度。包含一个符号位,一个小数点。实际显示的数字只有str_width-2位。</param>
/// <param name="decimal">小数点显示的位数</param>
/// <returns>数字转换成字符串的长度</returns>
void float_to_str(float val, char* str, int str_width, int decimal);
//

/// <summary>
/// 整形转字符串。
/// </summary>
/// <param name="val">待转换的数据</param>
/// <param name="str">转换的字符串，左对齐。如果字符串长度不够，只记录高位。</param>
/// <param name="str_width">字符串的宽度。包含一个符号位,一个小数点。实际显示的数字只有str_width-2位。</param>
/// <param name="decimal">小数点显示的位数</param>
/// <returns>数字转换成字符串的长度</returns>
int float_to_str_left(float val, char* str, int str_width, int decimal);
//


void test_data_converter(void);



#endif







